//
// Copyright (c) 2014, 保留所有权利。
//
// MappingHandler.java
//
// 作    者：王红燕
// 当前版本：1.0
// 2014 下午2:01:47
//
// 
//
package com.common.api.handler;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.log4j.Logger;

import com.vanke.agent.ADataSource;
import com.vanke.agent.bean.Mapping;
import com.vanke.agent.common.Cache;
import com.vanke.agent.common.Util;
import com.vanke.agent.common.log.LoggerUtil;

/**
 * 映射更新接口，用于实现更新指定客户ID（数据中心客户ID）的，当前对应的手机映射、明源GUID映射和<br>
 * 身份证映射，更新到主档表对应的contact、OriGUIDList和CardIdList三个字段
 */
public class MappingHandler extends ApiHandler {
	Logger log = LoggerUtil.getLoggerByName("mapping_update");

	public static void main(String[] args) {
		Set<Long> syncedGuid = new HashSet<Long>();
		syncedGuid.add(Long.valueOf(args[0]));
		JSONObject json = new JSONObject();
		json.put("cmd", "update_mapping");
		json.put("ids", syncedGuid);
		System.out.println(json);
		MappingHandler mappingHandler = new MappingHandler();
		System.out.println(mappingHandler.handle(json));
	}

	@Override
	public JSONObject handle(JSONObject json) {
		/*
		 * 请求参数：
		 * {
		 * "header":{"cmd": "update_mapping"}, // 调用命令，供外层调度用
		 * "ids": [1,2,3,4] // 需要更新的客户ID列表
		 * }
		 * 
		 * 响应参数：
		 * {
		 * "errcode": 0, // 错误码，0为成功
		 * "errmsg": "", // 错误描述
		 * "success": [1,3,4], // 成功更新的ID列表
		 * "errors": [2] // 未成功更新的ID列表
		 * }
		 */
		if (!json.containsKey("ids")) {
			return genErr(1001, "缺少必须参数[ids]");
		}
		JSONObject result = getDefResult();
		Connection bizCon = ADataSource.getConnection(ADataSource.SCHEMA_BIZ);
		try {
			// 取请求参数里的ID列表，有任何一个不合法，则不执行后续步骤
			Set<Long> csts = new HashSet<Long>();
			JSONArray ids = json.getJSONArray("ids");
			int size = ids.size();
			for (int i = 0; i < size; i++) {
				csts.add(ids.getLong(i));
			}
			// 加载映射列表
			Map<String, Map<Long, Mapping>> mappings = Cache.loadCache(bizCon, csts);

			Iterator<Entry<String, Map<Long, Mapping>>> iter;
			iter = mappings.entrySet().iterator();
			Set<Long> succes = new HashSet<Long>();
			Set<Long> errors = new HashSet<Long>();
			while (iter.hasNext()) {
				Entry<String, Map<Long, Mapping>> entry = iter.next();
				Map<Long, Mapping> map = entry.getValue();
				if (updateMapping(bizCon, entry.getKey(), map)) {
					succes.addAll(map.keySet());
				} else {
					errors.addAll(map.keySet());
				}
			} // end while
			result.put("success", succes);
			result.put("errors", errors);
		} catch (Exception e) {
			e.printStackTrace();
			String msg = e.getMessage();
			if (msg != null) {
				if (msg.contains("not a JSONArray")
						|| msg.contains("not a number")) {
					return genErr(1002, "参数类型错误[ids]");
				}
			}
			return genErr(1005, "系统处理失败");
		} finally {
			ADataSource.close(bizCon);
		}
		return result;
	} //~handle(JSONObject json)

	public boolean updateMapping(Connection bizCon, String table,
			Map<Long, Mapping> mappings) {
		PreparedStatement pstmt = null;
		String sql = "update " + table
				+ " set contact=?,CardIdList=?,OriGUIDList=? where CstGUID=?";
		try {
			pstmt = bizCon.prepareStatement(sql);
			Iterator<Entry<Long, Mapping>> iter = mappings.entrySet()
					.iterator();
			while (iter.hasNext()) {
				Entry<Long, Mapping> entry = iter.next();
				long guid = entry.getKey();
				Mapping m = entry.getValue();
				pstmt.setString(1, Util.convertToString(m.getMobiles()));
				pstmt.setString(2, Util.convertToString(m.getCardIds()));
				pstmt.setString(3, Util.convertToString(m.getOriGuids()));
				pstmt.setLong(4, guid);
				pstmt.addBatch();
			} // end while
			pstmt.executeBatch();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			log.error("更新映射列表错误：" + e);
			return false;
		} finally {
			ADataSource.close(pstmt);
		}
	} //~updateMapping

} //~
